package cn.demoncat.util.web.config;

import cn.demoncat.util.lang.ThreadUtil;
import cn.demoncat.util.web.util.AsyncExceptionHandler;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.scheduling.annotation.AsyncConfigurerSupport;
import org.springframework.scheduling.annotation.EnableAsync;

import javax.annotation.Resource;
import java.util.concurrent.Executor;

/**
 * 异步执行器线程池配置
 * 
 * @author 延晓磊
 *
 * @since 2017年9月15日
 */
// 启用异步调用功能
@EnableAsync
@Configuration
public class AsyncExecutorConfig extends AsyncConfigurerSupport {

	@Resource
	private AsyncExecutorProperties asyncExecutorProperties;

	/**
	 * 异步操作的主线程池
	 * 
	 * @return	线程池，供@Async使用，也可以供AsyncUtil,CompletableFuture使用
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年5月14日
	 */
	@Bean("asyncExecutor")
	@Primary
	@Override
	public Executor getAsyncExecutor() {
		return ThreadUtil.buildExecutor("AsyncExecutor",asyncExecutorProperties.getCorePoolSize(),asyncExecutorProperties.getMaxPoolSize(),asyncExecutorProperties.getQueueCapacity());
	}

	/**
	 * 异步操作的异常统一处理器
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年8月16日
	 */
	@Override
	public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
		return new AsyncExceptionHandler();
	}
 
}
